package sgsi.model.alocacion;

import java.util.List;

import sgsi.model.entidades.Articulo;
import sgsi.model.entidades.Cliente;
import sgsi.model.entidades.Palet;
import sgsi.model.entidades.TipoDeArticulo;
import sgsi.model.entidades.espacios.Area;

public class CriterioOrdenAreasPorCliente implements CriterioOrdenAreas {

	private Cliente cliente;
	private TipoDeArticulo tipoDeArticulo;
	private Articulo articulo;
	

	public void initCriterio(List<Palet> palets) {
		// Seteo los datos iniciales (para palets homogeneos)
		tipoDeArticulo = palets.get(0).getArticulo().getTipoDeArticulo();
		articulo = palets.get(0).getArticulo();
		cliente = palets.get(0).getCliente();
	}

	public int compare(Area area1, Area area2) {
		int comparacion = calcularPuntaje(area1).compareTo(calcularPuntaje(area2));
		
		if (comparacion != 0)
			return (comparacion * -1);
		
		if (area1.getCodigoArea() < area2.getCodigoArea())
			return -1;
		
		if (area1.getCodigoArea() > area2.getCodigoArea())
			return 1;
		
		return 0;				
	}

	private Integer calcularPuntaje(Area area) {
		boolean mismoCliente = area.tienePaletsDelCliente(cliente);
		boolean mismoTipoDeArticulo = area.tienePaletsDelTipoDeArticulo(tipoDeArticulo);
		boolean mismoArticulo = area.tienePaletsDelArticulo(articulo);
							
		int puntaje = 0;
		if (mismoCliente)
			puntaje = puntaje + (int)(Math.pow(2, 6));
		
		if (mismoTipoDeArticulo)
			puntaje = puntaje + (int)(Math.pow(2, 5));
		
		if (mismoArticulo)
			puntaje = puntaje + (int)(Math.pow(2, 4));
		
		puntaje = (int) (puntaje + Math.pow(2, area.getPrioridad().getPonderacion()));
		
		return puntaje;				
	}

}
